package model.subject;

import java.util.Collection;

import commands.Command;

import model.algorithmes.SpreadingAlgorithme;
import model.value.VersionnedValue;
import model.observer.SensorObserver;

/**
 * Interface du modèle d'un capteur. Les observeurs attachés à un capteur pourront récupérer la valeur.
 */
public interface Sensor {
		
	/**
	 * Modification de la valeur du capteur qui doit en fait être validée par la stratégie.
	 * @param value	La nouvelle valeur du capteur.
	 */
	public void setValue(int value);
	
	/**
	 * Récupération de la valeur du capteur, via sa stratégie.
	 * @return	La valeur de la stratégie associée au capteur.
	 */
	public VersionnedValue getValue();
	
	/**
	 * Modification de l'algorithme utilisé pour la diffusion des valeurs du capteur.
	 * @param spreadingAlgorithme	Le nouveau algorithme utilisé pour la diffusion des valeurs du capteur.
	 */
	public void setSpreadingAlgorithme(SpreadingAlgorithme spreadingAlgorithme);
	
	/**
	 * Attache un observeur au capteur. Celui-ci sera notifié lors d'un changement d'état du capteur.
	 * @param observer	L'observeur que l'on veut attacher au capteur.
	 */
	public void attach(SensorObserver observer);
	
	/**
	 * Détache un observeur du sujet. Celui-ci ne sera plus notifié lors d'un changement d'état du capteur.
	 * @param observer	L'observeur que l'on veut détacher du capteur.
	 */
	public void detach(SensorObserver observer);
		
	/**
	 * Récupération des observeurs attachés au capteur.
	 * @return	Les observeurs attachés au capteur.
	 */
	public Collection<SensorObserver> getObservers();
	
	/**
	 * Modification directe de la valeur du capteur.
	 * @param value	La nouvelle valeur du capteur.
	 */
	public void setRealValue(int value);
	
	/**
	 * Récupération directe de la valeur du capteur.
	 * @return	La valeur du capteur.
	 */
	public VersionnedValue getRealValue();
	
	/**
	 * Modification de la commande destinée à mettre à jour la présentation d'un capteur après une modification de la valeur du capteur. 
	 * @param notifyChangesToApplicationPanelCommand	La nouvelle commande destinée à mettre à jour la présentation d'un capteur après une modification
	 * 													de la valeur. 
	 */
	public void setNotifyChangesToApplicationPanelCommand(Command notifyChangesToApplicationPanelCommand);

}
